#如需创建类，请使用 class 关键字：
class MyClass:
  name = '小明'
  age = 11

#现在我们可以使用名为 myClass 的类来创建对象：
p1 = MyClass()
print(p1.name)
#输出：小明

#__init__() 函数
#创建名为 Person 的类，使用 __init__() 函数为 name 和 age 赋值：
class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("小明", 11)

print(p1.name, p1.age)
#输出：小明 11

#对象也可以包含方法。对象中的方法是属于该对象的函数。
class Person1:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  #self 参数是对类的当前实例的引用，用于访问属于该类的变量
  def myfunc(self):
    print("Hello my name is " + self.name)

p1 = Person1("小明", 11)
p1.myfunc()
#输出：Hello my name is 小明

#self 参数是对类的当前实例的引用，用于访问属于该类的变量
#它不必被命名为 self，您可以随意调用它，但它必须是类中任意函数的首个参数：
class Person3:
  def __init__(mysillyobject, name, age):
    mysillyobject.name = name
    mysillyobject.age = age

  def myfunc(abc):
    print("Hello my name is " + abc.name)

p1 = Person3("小明", 12)
p1.myfunc()
#输出：Hello my name is 小明

#修改对象属性
p1.name = '小红'
p1.myfunc()
#输出：Hello my name is 小红

#del 关键字删除对象的属性
del p1.age


#删除对象
del p1


#当离开 with 代码块的时候，系统会自动调用 __exit__() 方法， with 的作用和使用 try/finally 语句是一样的
class Testwith(object):
  '''
  with 包含了 __enter__ 和 __exit__ 方法
  '''

  def __enter__(self):
    print('run now ')

  def __exit__(self, exc_type, exc_val, exc_tb):
    if exc_tb is None:
      print('exit normal ')
    else:
      print('exit with exception')

#首先执行expression里面的__enter__函数，它的返回值会赋给as后面的variable。
#–>然后，开始执行with-block中的语句，不论成功失败(比如发生异常、错误，设置sys.exit())，在with-block执行完成后，会执行expression中的__exit__函数。
with Testwith():
  print('test')
  #抛出异常
  raise NameError('Exception')








